package com.sky.d_lock_free;

/**
 * http://www.jb51.net/article/92453.htm
 * 锁的优化和注意事项详解
 * 
 * @Author:hjt
 */
public class LockDemo {

}
/**
1. 锁优化的思路和方法
	减少锁持有时间：只用在有线程安全要求的程序上加锁
		优化前  public synchronized void syncMethod(){ 
			 othercode1(); 
			 mutextMethod(); 
			 othercode2(); 
		 }
		 优化后  public void syncMethod(){ 
			 othercode1(); 
			 synchronized(this)
			 {
			 	mutextMethod(); 
			 }
			 othercode2(); 
		 }
	
	
	减小锁粒度
		将大对象（这个对象可能会被很多线程访问），拆成小对象，大大增加并行度，降低锁竞争。降低了锁的竞争，偏向锁，轻量级锁成功率才会提高。
		最典型的减小锁粒度的案例就是ConcurrentHashMap

	锁分离
		最常见的锁分离就是读写锁ReadWriteLock，根据功能进行分离成读锁和写锁，这样读读不互斥，读写互斥，写写互斥，即保证了线程安全，又提高了性能
		读写分离思想可以延伸，只要操作互不影响，锁就可以分离
		
	锁粗化:LockCoarsingDemo
		通常情况下，为了保证多线程间的有效并发，会要求每个线程持有锁的时间尽量短，即在使用完公共资源后，应该立即释放锁。
		只有这样，等待在这个锁上的其他线程才能尽早的获得资源执行任务。但是，凡事都有一个度，如果对同一个锁不停的进行请求、同步和释放，
		其本身也会消耗系统宝贵的资源，反而不利于性能的优化 
		
	锁消除
		锁消除是在编译器级别的事情
		在即时编译器时，如果发现不可能被共享的对象，则可以消除这些对象的锁操作
		为什么写代码时直接不加锁？
			JDK实现的，比如Vector和StringBuffer
		开启锁消除是在JVM参数上设置的，当然需要在server模式下：
			-server -XX:+DoEscapeAnalysis -XX:+EliminateLocks
		并且要开启逃逸分析。 逃逸分析的作用呢，就是看看变量是否有可能逃出作用域的范围
2. 虚拟机内的锁优化
	对象头，在JVM中，每个对象都有一个对象头
		Mark Word，对象头的标记，32位（32位系统）。
		描述对象的hash、锁信息，垃圾回收标记，年龄
		还会保存指向锁记录的指针，指向monitor的指针，偏向锁线程ID等。
		简单来说，对象头就是要保存一些系统性的信息
	
	偏向锁
		锁会偏向于当前已经占有锁的线程
		

*/